package sys

import (
	"ginweb-admin/commons/base/api"
	"ginweb-admin/commons/response"
	"ginweb-admin/model/context"
	"ginweb-admin/model/entity/sys"
	"ginweb-admin/utils"
	"github.com/gin-gonic/gin"
)

type SysRoleApi struct {
	api.BaseApi
}

// 创建角色
func (api *SysRoleApi) CreateData(c *gin.Context) {
	// 准备接收角色数据的载体
	sysRole := sys.SysRole{}
	// 绑定数据参数
	err := c.ShouldBindJSON(&sysRole)
	if err != nil {
		// 参数绑定失败
		response.FailWithError(err, c)
		return
	}

	// 判断当前角色的名字（重复），不能创建
	role, err := sysRoleService.FindName(sysRole.RoleName)
	if sysRole.RoleName == role.RoleName && err == nil {
		response.FailWithMessage("当前角色已被注册，请换个角色名！", c)
		return
	}

	// 调用service的创建角色方法
	err = sysRoleService.CreateData(sysRole)
	if err != nil {
		response.FailWithMessage("角色创建失败！", c)
		return
	}

	// 返回响应数据
	response.OkMessage("角色创建成功！", c)
}

// 根据id查询系统角色信息
func (api *SysRoleApi) GetById(c *gin.Context) {
	// 获取角色传递的id
	id := c.Param("id")
	// 调用查询的方法
	sysUser, err := sysRoleService.GetById(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("查询的角色不存在！", c)
		return
	}
	response.Ok(sysUser, c)

}

// 查询所有角色
func (api *SysRoleApi) FindList(c *gin.Context) {
	// 获取参数
	keyword := c.Query("keyword")

	// 调用查询的方法
	roles, err := sysRoleService.FindList(keyword)
	if roles == nil && err == nil {
		response.FailWithMessage("查询的结果有误", c)
		return
	}
	// 返回数据
	response.Ok(roles, c)
}

// 修改系统角色信息
func (api *SysRoleApi) UpdateData(c *gin.Context) {
	// 获取角色传递的参数
	var sysRole sys.SysRole
	// 绑定参数
	err := c.ShouldBindJSON(&sysRole)
	if err != nil {
		response.FailWithError(err, c)
		return
	}
	// // 结构体转化成map呢？
	// m := structs.Map(sysRole)
	// // 继承的结构体无法转换，要么手动添加，要么不使用继承
	// m["is_deleted"] = sysRole.IsDeleted

	// 嵌套结构体转map
	m := utils.StructToMap(sysRole)
	// 调用更新的方法
	err = sysRoleService.UpdateData(&sysRole, &m)
	if err != nil {
		response.FailWithMessage("更新失败！", c)
		return
	}
	response.OkMessage("更新成功！", c)
}

// 修改系统角色状态
func (api *SysRoleApi) UpdateStatus(c *gin.Context) {
	// 获取请求的结构体
	sysRoleStatus := context.StatusContext{}
	// 绑定参数
	err := c.ShouldBindJSON(&sysRoleStatus)
	if err != nil {
		// 如果参数注入失败或者出错就返回
		response.FailWithBindParams(c)
		return
	}

	// 调用修改状态的方法
	err = sysRoleService.UpdateStatus(sysRoleStatus)
	if err != nil {
		response.FailWithMessage("状态更新失败！", c)
		return
	}

	response.OkMessage("状态更新成功！", c)

}

// 单个删除系统角色信息
func (api *SysRoleApi) DeleteById(c *gin.Context) {
	// 获取角色传递的参数id
	id := c.Param("id")
	// 调用删除方法
	err := sysRoleService.DeleteById(api.StringToUnit(id))
	if err != nil {
		response.FailWithMessage("删除失败！", c)
		return
	}
	// 返回成功
	response.OkMessage("删除成功！", c)
}
